package com.whcoding.test;

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.util.Calendar;
import java.util.Date;

/**
 * @program: spring-boot-learning
 * @description:
 * @author: whcoding
 * @create: 2022-02-23 11:27
 **/
@SpringBootTest
public class DateTemp {

	/**
	 *
	 * 1.8 以前
	 * Date ：用于获取毫秒数，或者作为设置Calendar对象日期的参数，date.getTime()、calendar.setTime(date)
	 * SimpleDateFormat： 用于转换格式，String←→Date；
	 * Calendar： 用于具体操作，比如获取指定年、月的天数，日期对应的星期数，对应的月份数等。
	 * 获取日期的3种方式
	 *
	 * @throws ParseException
	 */
	@Test
	public void getDateStr() throws ParseException {

		//一、Date 的使用
		Date da=new Date();
		//二、SimpleDateFormat 的使用
		SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dateStr = sdf2.format(new Date());
		System.out.println("格式化返回的数据:"+dateStr);

		//1.时间格式不带T
		String timeStr = "2021-11-23 16:16:59.000Z";
		String timeByTStr = "2021-11-23T16:16:59.000Z";
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = format.parse(timeStr);
		System.out.println("时间格式不带T:" + date);

		//2.时间格式带T
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd\'T\'HH:mm:ss");
		Date date3 = sdf.parse(timeByTStr);
		System.out.println("时间格式带T:" + date3);

		//三、Calendar 的使用
		Calendar calendar=Calendar.getInstance();
		calendar.setTime(date);
		//获取一个月的天数
		Integer daysNumber=calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		// 1是周天 、7、是周六
		Integer dayOfWeek=calendar.get(Calendar.DAY_OF_WEEK);
	}

	/**
	 * 1.8 以后
	 * LocalDate， LocalDate是一个不可变的日期时间对象，表
	 * 				日期，通常被视为年月日 该类不存储或表示时间或时区。 相反，它是日期的描述
	 * LocalTime， LocalTime是一个不可变的日期时间对象，代表一个时间，通常被看作是小时 - 秒。 时间表示为纳秒精度。
	 * LocalDateTime  相当于LocalDate+LocalTime
	 */
	@Test
	public void getDateStr2(){
		//一、LocalDate
		LocalDate now = LocalDate.now();
		System.out.println(now);
		//设置日期
		LocalDate localDate = LocalDate.of(2022, 4, 19);
		System.out.println(localDate);
		//获取年
		int year = localDate.getYear();
		int year1 = localDate.get(ChronoField.YEAR);
		//获取月
		Month month = localDate.getMonth();   // 结果：SEPTEMBER
		int month1 = localDate.get(ChronoField.MONTH_OF_YEAR); //结果：4

		//获取日
		int day = localDate.getDayOfMonth();   //结果：20
		int day1 = localDate.get(ChronoField.DAY_OF_MONTH); // 结果：20

		//获取星期数
		DayOfWeek dayOfWeek = localDate.getDayOfWeek();
		int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);
		System.out.println(dayOfWeek);
		System.out.println(dayOfWeek1);

		//二、LocalTime
		LocalTime localTimeNow = LocalTime.now();
		// 设置时间
		LocalTime localTime = LocalTime.of(13, 51, 10);
		//获取小时
		int hour = localTime.getHour();    // 结果：13
		int hour1 = localTime.get(ChronoField.HOUR_OF_DAY); // 结果：13
		System.out.println(localTimeNow);
		System.out.println(localTime);
		System.out.println(hour);
		System.out.println(hour1);

		//获取分
		int minute = localTime.getMinute();
		int minute1 = localTime.get(ChronoField.MINUTE_OF_HOUR);
		System.out.println(minute);
		System.out.println(minute1);
		//获取秒
		int second = localTime.getSecond();
		int second1 = localTime.get(ChronoField.SECOND_OF_MINUTE);
		System.out.println(second);
		System.out.println(second1);

		//三、LocalDateTime
		LocalDateTime localDateTime = LocalDateTime.now();
		// 设置日期
		LocalDateTime localDateTime1 = LocalDateTime.of(2022, Month.APRIL, 20, 15, 33, 56);
		LocalDateTime localDateTime2 = LocalDateTime.of(localDate, localTime);
		LocalDateTime localDateTime3 = localDate.atTime(localTime);
		LocalDateTime localDateTime4 = localTime.atDate(localDate);
		System.out.println(localDateTime);
		System.out.println(localDateTime1);
		System.out.println(localDateTime2);
		System.out.println(localDateTime3);
		System.out.println(localDateTime4);
		// 获取LocalDate
		LocalDate localDate2 = localDateTime.toLocalDate();
		// 获取LocalTime
		LocalTime localTime2 = localDateTime.toLocalTime();
		System.out.println(localDate2);
		System.out.println(localTime2);

	}

	/**
	 * 获取hutool的数据
	 */
	@Test
	public void getHutoolDate() {
		//时间转化为 yyyyMMddHHmmss
		String dateStr = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_PATTERN);
		System.out.println(dateStr);
	}

	/**
	 * 格式 yyyy年MM月dd日 HH:mm:ss
	 *
	 * @param dateTime
	 * @return
	 */
	public static String getDateTimeDisplayString(LocalDateTime dateTime) {
		DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
		String strDate2 = dtf2.format(dateTime);
		return strDate2;
	}


}
